Reactμ μΌκ΄ μ λ°μ΄νΈμ λν μ¬μΈ΅ λΆμ, λΆνμν 리λ λλ§μ μ€μ¬ μ±λ₯μ κ°μ νλ λ°©λ², κ·Έλ¦¬κ³ μ΄λ₯Ό ν¨κ³Όμ μΌλ‘ νμ©νκΈ° μν λͺ¨λ² μ¬λ‘λ₯Ό μμλ΄ λλ€.
React μΌκ΄ μ λ°μ΄νΈ: μ±λ₯μ μν μν λ³κ²½ μ΅μ ν
Reactμ μ±λ₯μ λΆλλ½κ³ λ°μμ±μ΄ λ°μ΄λ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό λ§λλ λ° λ§€μ° μ€μν©λλ€. Reactκ° μ±λ₯μ μ΅μ ννκΈ° μν΄ μ¬μ©νλ ν΅μ¬ λ©μ»€λμ¦ μ€ νλλ μΌκ΄ μ λ°μ΄νΈ(batched updates)μ λλ€. μ΄ κΈ°μ μ μ¬λ¬ μν μ λ°μ΄νΈλ₯Ό λ¨μΌ 리λ λλ§ μ£ΌκΈ°λ‘ κ·Έλ£Ήννμ¬ λΆνμν 리λ λλ§ νμλ₯Ό ν¬κ² μ€μ΄κ³ μ λ°μ μΈ μ ν리μΌμ΄μ λ°μμ±μ ν₯μμν΅λλ€. μ΄ κΈμμλ Reactμ μΌκ΄ μ λ°μ΄νΈμ 볡μ‘μ±μ κΉμ΄ νκ³ λ€μ΄, μλ λ°©μ, μ΄μ , νκ³, κ·Έλ¦¬κ³ κ³ μ±λ₯ React μ ν리μΌμ΄μ μ ꡬμΆνκΈ° μν΄ μ΄λ₯Ό ν¨κ³Όμ μΌλ‘ νμ©νλ λ°©λ²μ μ€λͺ ν©λλ€.
Reactμ λ λλ§ νλ‘μΈμ€ μ΄ν΄νκΈ°
μΌκ΄ μ λ°μ΄νΈμ λν΄ μμ보기 μ μ Reactμ λ λλ§ νλ‘μΈμ€λ₯Ό μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. μ»΄ν¬λνΈμ μνκ° λ³κ²½λ λλ§λ€ Reactλ ν΄λΉ μ»΄ν¬λνΈμ κ·Έ μμλ€μ 리λ λλ§νμ¬ μ¬μ©μ μΈν°νμ΄μ€μ μλ‘μ΄ μνλ₯Ό λ°μν΄μΌ ν©λλ€. μ΄ κ³Όμ μ λ€μ λ¨κ³λ₯Ό ν¬ν¨ν©λλ€:
- μν μ
λ°μ΄νΈ: μ»΄ν¬λνΈμ μνκ°
setStateλ©μλ(λλuseStateμ κ°μ ν )λ₯Ό μ¬μ©νμ¬ μ λ°μ΄νΈλ©λλ€. - μ¬μ‘°μ (Reconciliation): Reactλ μλ‘μ΄ κ°μ DOMμ μ΄μ μ κ²κ³Ό λΉκ΅νμ¬ μ°¨μ΄μ ("diff")μ μλ³ν©λλ€.
- 컀λ°(Commit): Reactλ μλ³λ μ°¨μ΄μ μ κΈ°λ°μΌλ‘ μ€μ DOMμ μ λ°μ΄νΈν©λλ€. μ΄ λ¨κ³μμ λ³κ²½ μ¬νμ΄ μ¬μ©μμκ² λ³΄μ¬μ§λλ€.
리λ λλ§μ νΉν κΉμ μ»΄ν¬λνΈ νΈλ¦¬λ₯Ό κ°μ§ 볡μ‘ν μ»΄ν¬λνΈμ κ²½μ° κ³μ° λΉμ©μ΄ λ§μ΄ λλ μμ μΌ μ μμ΅λλ€. μ¦μ 리λ λλ§μ μ±λ₯ λ³λͺ© νμκ³Ό λλ¦° μ¬μ©μ κ²½νμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
μΌκ΄ μ λ°μ΄νΈλ 무μμΈκ°?
μΌκ΄ μ λ°μ΄νΈλ Reactκ° μ¬λ¬ μν μ λ°μ΄νΈλ₯Ό λ¨μΌ 리λ λλ§ μ£ΌκΈ°λ‘ κ·Έλ£Ήννλ μ±λ₯ μ΅μ ν κΈ°μ μ λλ€. κ° κ°λ³ μν λ³κ²½ νμ μ»΄ν¬λνΈλ₯Ό 리λ λλ§νλ λμ , Reactλ νΉμ λ²μ λ΄μ λͺ¨λ μν μ λ°μ΄νΈκ° μλ£λ λκΉμ§ κΈ°λ€λ Έλ€κ° λ¨μΌ 리λ λλ§μ μνν©λλ€. μ΄λ DOMμ΄ μ λ°μ΄νΈλλ νμλ₯Ό ν¬κ² μ€μ¬ μ±λ₯μ ν₯μμν΅λλ€.
μΌκ΄ μ λ°μ΄νΈμ μλ λ°©μ
Reactλ λ€μκ³Ό κ°μ΄ μ μ΄λ νκ²½ λ΄μμ λ°μνλ μν μ λ°μ΄νΈλ₯Ό μλμΌλ‘ μΌκ΄ μ²λ¦¬ν©λλ€:
- μ΄λ²€νΈ νΈλ€λ¬:
onClick,onChange,onSubmitκ³Ό κ°μ μ΄λ²€νΈ νΈλ€λ¬ λ΄μ μν μ λ°μ΄νΈλ μΌκ΄ μ²λ¦¬λ©λλ€. - React μλͺ
μ£ΌκΈ° λ©μλ (ν΄λμ€ μ»΄ν¬λνΈ):
componentDidMountλ°componentDidUpdateμ κ°μ μλͺ μ£ΌκΈ° λ©μλ λ΄μ μν μ λ°μ΄νΈλ μΌκ΄ μ²λ¦¬λ©λλ€. - React ν
: μ΄λ²€νΈ νΈλ€λ¬μ μν΄ νΈλ¦¬κ±°λλ
useStateλλ 컀μ€ν ν μ ν΅ν μν μ λ°μ΄νΈλ μΌκ΄ μ²λ¦¬λ©λλ€.
μ΄λ¬ν 컨ν μ€νΈ λ΄μμ μ¬λ¬ μν μ λ°μ΄νΈκ° λ°μνλ©΄ Reactλ μ΄λ₯Ό λκΈ°μ΄μ μΆκ°ν λ€μ μ΄λ²€νΈ νΈλ€λ¬λ μλͺ μ£ΌκΈ° λ©μλκ° μλ£λ νμ λ¨μΌ μ¬μ‘°μ λ° μ»€λ° λ¨κ³λ₯Ό μνν©λλ€.
μμ:
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
setCount(count + 1);
setCount(count + 1);
};
return (
Count: {count}
);
}
export default Counter;
μ΄ μμμμ "Increment" λ²νΌμ ν΄λ¦νλ©΄ handleClick ν¨μκ° νΈλ¦¬κ±°λμ΄ setCountλ₯Ό μΈ λ² νΈμΆν©λλ€. Reactλ μ΄ μΈ λ²μ μν μ
λ°μ΄νΈλ₯Ό λ¨μΌ μ
λ°μ΄νΈλ‘ μΌκ΄ μ²λ¦¬ν©λλ€. κ²°κ³Όμ μΌλ‘ μ»΄ν¬λνΈλ ν λ²λ§ 리λ λλ§λλ©°, κ° setCount νΈμΆλ§λ€ 1μ©μ΄ μλλΌ countκ° 3λ§νΌ μ¦κ°νκ² λ©λλ€. λ§μ½ Reactκ° μ
λ°μ΄νΈλ₯Ό μΌκ΄ μ²λ¦¬νμ§ μμλ€λ©΄ μ»΄ν¬λνΈλ μΈ λ² λ¦¬λ λλ§λμ΄ λΉν¨μ¨μ μΌ κ²μ
λλ€.
μΌκ΄ μ λ°μ΄νΈμ μ΄μ
μΌκ΄ μ λ°μ΄νΈμ μ£Όμ μ΄μ μ 리λ λλ§ νμλ₯Ό μ€μ¬ μ±λ₯μ κ°μ νλ κ²μ λλ€. μ΄λ λ€μκ³Ό κ°μ κ²°κ³Όλ‘ μ΄μ΄μ§λλ€:
- λ λΉ λ₯Έ UI μ λ°μ΄νΈ: 리λ λλ§μ΄ μ€μ΄λ€λ©΄ μ¬μ©μ μΈν°νμ΄μ€ μ λ°μ΄νΈκ° λΉ¨λΌμ Έ μ ν리μΌμ΄μ μ λ°μμ±μ΄ ν₯μλ©λλ€.
- DOM μ‘°μ κ°μ: DOM μ λ°μ΄νΈ λΉλκ° μ€μ΄λ€λ©΄ λΈλΌμ°μ μ μμ λμ΄ μ€μ΄λ€μ΄ μ±λ₯μ΄ ν₯μλκ³ λ¦¬μμ€ μλΉκ° κ°μν©λλ€.
- μ λ°μ μΈ μ ν리μΌμ΄μ μ±λ₯ ν₯μ: μΌκ΄ μ λ°μ΄νΈλ νΉν μν λ³κ²½μ΄ μ¦μ 볡μ‘ν μ ν리μΌμ΄μ μμ λ λΆλλ½κ³ ν¨μ¨μ μΈ μ¬μ©μ κ²½νμ κΈ°μ¬ν©λλ€.
μΌκ΄ μ λ°μ΄νΈκ° μ μ©λμ§ μλ κ²½μ°
Reactκ° λ§μ μλ리μ€μμ μ λ°μ΄νΈλ₯Ό μλμΌλ‘ μΌκ΄ μ²λ¦¬νμ§λ§, μΌκ΄ μ²λ¦¬κ° λ°μνμ§ μλ μν©λ μμ΅λλ€:
- λΉλκΈ° μμ
(Reactμ μ μ΄ λ²μ λ°):
setTimeout,setIntervalλλ νλ‘λ―Έμ€μ κ°μ λΉλκΈ° μμ λ΄μμ μνλλ μν μ λ°μ΄νΈλ μΌλ°μ μΌλ‘ μλμΌλ‘ μΌκ΄ μ²λ¦¬λμ§ μμ΅λλ€. μ΄λ Reactκ° μ΄λ¬ν μμ μ μ€ν 컨ν μ€νΈλ₯Ό μ μ΄ν μ μκΈ° λλ¬Έμ λλ€. - λ€μ΄ν°λΈ μ΄λ²€νΈ νΈλ€λ¬: λ€μ΄ν°λΈ μ΄λ²€νΈ 리μ€λ(μ:
addEventListenerλ₯Ό μ¬μ©νμ¬ DOM μμμ μ§μ 리μ€λλ₯Ό 첨λΆνλ κ²½μ°)λ₯Ό μ¬μ©νλ κ²½μ°, ν΄λΉ νΈλ€λ¬ λ΄μ μν μ λ°μ΄νΈλ μΌκ΄ μ²λ¦¬λμ§ μμ΅λλ€.
μμ (λΉλκΈ° μμ ):
import React, { useState } from 'react';
function DelayedCounter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setTimeout(() => {
setCount(count + 1);
setCount(count + 1);
setCount(count + 1);
}, 0);
};
return (
Count: {count}
);
}
export default DelayedCounter;
μ΄ μμμμλ setCountκ° μ°μμΌλ‘ μΈ λ² νΈμΆλμ§λ§, setTimeout μ½λ°± λ΄μ μμ΅λλ€. κ²°κ³Όμ μΌλ‘ Reactλ μ΄λ¬ν μ
λ°μ΄νΈλ₯Ό μΌκ΄ μ²λ¦¬νμ§ *μμΌλ©°*, μ»΄ν¬λνΈλ μΈ λ² λ¦¬λ λλ§λκ³ κ° λ¦¬λ λλ§μμ μΉ΄μ΄νΈκ° 1μ© μ¦κ°ν©λλ€. μ΄ λμμ μ»΄ν¬λνΈλ₯Ό μ μ νκ² μ΅μ ννκΈ° μν΄ μ΄ν΄νλ κ²μ΄ λ§€μ° μ€μν©λλ€.
`unstable_batchedUpdates`λ‘ μΌκ΄ μ λ°μ΄νΈ κ°μ νκΈ°
Reactκ° μλμΌλ‘ μ
λ°μ΄νΈλ₯Ό μΌκ΄ μ²λ¦¬νμ§ μλ μλ리μ€μμλ react-domμ unstable_batchedUpdatesλ₯Ό μ¬μ©νμ¬ μΌκ΄ μ²λ¦¬λ₯Ό κ°μ ν μ μμ΅λλ€. μ΄ ν¨μλ₯Ό μ¬μ©νλ©΄ μ¬λ¬ μν μ
λ°μ΄νΈλ₯Ό λ¨μΌ λ°°μΉλ‘ λ¬Άμ΄ λ¨μΌ 리λ λλ§ μ£ΌκΈ°μμ ν¨κ» μ²λ¦¬λλλ‘ ν μ μμ΅λλ€.
μ°Έκ³ : unstable_batchedUpdates APIλ λΆμμ ν κ²μΌλ‘ κ°μ£Όλλ©° ν₯ν React λ²μ μμ λ³κ²½λ μ μμ΅λλ€. μ£Όμν΄μ μ¬μ©νκ³ νμν κ²½μ° μ½λλ₯Ό μ‘°μ ν μ€λΉλ₯Ό ν΄μΌ ν©λλ€. κ·Έλ¬λ μΌκ΄ μ²λ¦¬ λμμ λͺ
μμ μΌλ‘ μ μ΄νλ λ° μ μ©ν λκ΅¬λ‘ λ¨μ μμ΅λλ€.
μμ (`unstable_batchedUpdates` μ¬μ©):
import React, { useState } from 'react';
import { unstable_batchedUpdates } from 'react-dom';
function DelayedCounter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setTimeout(() => {
unstable_batchedUpdates(() => {
setCount(count + 1);
setCount(count + 1);
setCount(count + 1);
});
}, 0);
};
return (
Count: {count}
);
}
export default DelayedCounter;
μ΄ μμ λ μμμμλ unstable_batchedUpdatesλ₯Ό μ¬μ©νμ¬ setTimeout μ½λ°± λ΄μ μΈ setCount νΈμΆμ κ°μλλ€. μ΄λ κ² νλ©΄ Reactκ° μ΄λ¬ν μ
λ°μ΄νΈλ₯Ό μΌκ΄ μ²λ¦¬νλλ‘ κ°μ νμ¬ λ¨μΌ 리λ λλ§μ΄ λ°μνκ³ μΉ΄μ΄νΈκ° 3λ§νΌ μ¦κ°ν©λλ€.
React 18κ³Ό μλ μΌκ΄ μ²λ¦¬
React 18μ λ λ§μ μλ리μ€μ λν΄ μλ μΌκ΄ μ²λ¦¬λ₯Ό λμ
νμ΅λλ€. μ΄λ Reactκ° νμμμ, νλ‘λ―Έμ€, λ€μ΄ν°λΈ μ΄λ²€νΈ νΈλ€λ¬ λλ κΈ°ν λͺ¨λ μ΄λ²€νΈ λ΄μμ λ°μν λμλ μν μ
λ°μ΄νΈλ₯Ό μλμΌλ‘ μΌκ΄ μ²λ¦¬νλ€λ κ²μ μλ―Έν©λλ€. μ΄λ μ±λ₯ μ΅μ νλ₯Ό ν¬κ² λ¨μννκ³ unstable_batchedUpdatesλ₯Ό μλμΌλ‘ μ¬μ©ν νμμ±μ μ€μ¬μ€λλ€.
μμ (React 18 μλ μΌκ΄ μ²λ¦¬):
import React, { useState } from 'react';
function DelayedCounter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setTimeout(() => {
setCount(count + 1);
setCount(count + 1);
setCount(count + 1);
}, 0);
};
return (
Count: {count}
);
}
export default DelayedCounter;
React 18μμλ μ μμ κ° setTimeout λ΄μ μμμλ λΆκ΅¬νκ³ setCount νΈμΆμ μλμΌλ‘ μΌκ΄ μ²λ¦¬ν©λλ€. μ΄λ Reactμ μ±λ₯ μ΅μ ν κΈ°λ₯μ μμ΄ μλΉν κ°μ μ
λλ€.
μΌκ΄ μ λ°μ΄νΈ νμ©μ μν λͺ¨λ² μ¬λ‘
μΌκ΄ μ λ°μ΄νΈλ₯Ό ν¨κ³Όμ μΌλ‘ νμ©νκ³ React μ ν리μΌμ΄μ μ μ΅μ ννλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό κ³ λ €νμμμ€:
- κ΄λ ¨ μν μ λ°μ΄νΈ κ·Έλ£Ήν: κ°λ₯ν λλ§λ€ κ΄λ ¨λ μν μ λ°μ΄νΈλ₯Ό λμΌν μ΄λ²€νΈ νΈλ€λ¬λ μλͺ μ£ΌκΈ° λ©μλ λ΄μμ κ·Έλ£Ήννμ¬ μΌκ΄ μ²λ¦¬μ μ΄μ μ κ·Ήλννμμμ€.
- λΆνμν μν μ
λ°μ΄νΈ νΌνκΈ°: μ»΄ν¬λνΈμ μνλ₯Ό μ μ€νκ² μ€κ³νκ³ μ¬μ©μ μΈν°νμ΄μ€μ μν₯μ λ―ΈμΉμ§ μλ λΆνμν μ
λ°μ΄νΈλ₯Ό νΌνμ¬ μν μ
λ°μ΄νΈ νμλ₯Ό μ΅μννμμμ€. propsκ° λ³κ²½λμ§ μμ μ»΄ν¬λνΈμ 리λ λλ§μ λ°©μ§νκΈ° μν΄ λ©λͺ¨μ΄μ μ΄μ
(μ:
React.memo)κ³Ό κ°μ κΈ°μ μ μ¬μ©νλ κ²μ κ³ λ €νμμμ€. - ν¨μν μ
λ°μ΄νΈ μ¬μ©: μ΄μ μνλ₯Ό κΈ°λ°μΌλ‘ μνλ₯Ό μ
λ°μ΄νΈν λλ ν¨μν μ
λ°μ΄νΈλ₯Ό μ¬μ©νμμμ€. μ΄λ κ² νλ©΄ μ
λ°μ΄νΈκ° μΌκ΄ μ²λ¦¬λ λμλ μ¬λ°λ₯Έ μν κ°μΌλ‘ μμ
ν μ μμ΅λλ€. ν¨μν μ
λ°μ΄νΈλ
setState(λλuseStateμ setter)μ μ΄μ μνλ₯Ό μΈμλ‘ λ°λ ν¨μλ₯Ό μ λ¬ν©λλ€. - λΉλκΈ° μμ
μ μνκΈ°: μ΄μ λ²μ μ React(18 μ΄μ )μμλ λΉλκΈ° μμ
λ΄μ μν μ
λ°μ΄νΈκ° μλμΌλ‘ μΌκ΄ μ²λ¦¬λμ§ μλλ€λ μ μ μ μνμμμ€. νμν κ²½μ°
unstable_batchedUpdatesλ₯Ό μ¬μ©νμ¬ μΌκ΄ μ²λ¦¬λ₯Ό κ°μ νμμμ€. κ·Έλ¬λ μλ‘μ΄ νλ‘μ νΈμ κ²½μ° μλ μΌκ΄ μ²λ¦¬μ μ΄μ μ νμ©νκΈ° μν΄ React 18λ‘ μ κ·Έλ μ΄λνλ κ²μ΄ κ°λ ₯ν κΆμ₯λ©λλ€. - μ΄λ²€νΈ νΈλ€λ¬ μ΅μ ν: μ΄λ²€νΈ νΈλ€λ¬ λ΄μ μ½λλ₯Ό μ΅μ ννμ¬ λ λλ§ νλ‘μΈμ€λ₯Ό λ¦μΆ μ μλ λΆνμν κ³μ°μ΄λ DOM μ‘°μμ νΌνμμμ€.
- μ ν리μΌμ΄μ νλ‘νμΌλ§: Reactμ νλ‘νμΌλ§ λꡬλ₯Ό μ¬μ©νμ¬ μ±λ₯ λ³λͺ© νμκ³Ό μΌκ΄ μ λ°μ΄νΈλ₯Ό μΆκ°λ‘ μ΅μ νν μ μλ μμμ μλ³νμμμ€. React DevToolsμ Performance νμ 리λ λλ§μ μκ°ννκ³ κ°μ κΈ°νλ₯Ό μλ³νλ λ° λμμ΄ λ μ μμ΅λλ€.
μμ (ν¨μν μ λ°μ΄νΈ):
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(prevCount => prevCount + 1);
setCount(prevCount => prevCount + 1);
setCount(prevCount => prevCount + 1);
};
return (
Count: {count}
);
}
export default Counter;
μ΄ μμμμλ ν¨μν μ
λ°μ΄νΈλ₯Ό μ¬μ©νμ¬ μ΄μ κ°μ κΈ°λ°μΌλ‘ countλ₯Ό μ¦κ°μν΅λλ€. μ΄λ κ² νλ©΄ μ
λ°μ΄νΈκ° μΌκ΄ μ²λ¦¬λ λμλ countκ° μ¬λ°λ₯΄κ² μ¦κ°νλλ‘ λ³΄μ₯ν©λλ€.
κ²°λ‘
Reactμ μΌκ΄ μ λ°μ΄νΈλ λΆνμν 리λ λλ§μ μ€μ¬ μ±λ₯μ μ΅μ ννλ κ°λ ₯ν λ©μ»€λμ¦μ λλ€. μΌκ΄ μ λ°μ΄νΈμ μλ λ°©μ, νκ³, κ·Έλ¦¬κ³ μ΄λ₯Ό ν¨κ³Όμ μΌλ‘ νμ©νλ λ°©λ²μ μ΄ν΄νλ κ²μ κ³ μ±λ₯ React μ ν리μΌμ΄μ μ ꡬμΆνλ λ° λ§€μ° μ€μν©λλ€. μ΄ κΈμμ μ€λͺ ν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ React μ ν리μΌμ΄μ μ λ°μμ±κ³Ό μ λ°μ μΈ μ¬μ©μ κ²½νμ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. React 18μ΄ μλ μΌκ΄ μ²λ¦¬λ₯Ό λμ ν¨μ λ°λΌ μν λ³κ²½ μ΅μ νλ λμ± κ°λ¨νκ³ ν¨κ³Όμ μ΄ λμ΄ κ°λ°μλ€μ΄ λ©μ§ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό ꡬμΆνλ λ° μ§μ€ν μ μκ² ν΄μ€λλ€.